import struct


class MspHelper:
    def __init__(self):
        pass
    def crc8_dvb_s2(self,data):
        """
        CRC8-DVB-S2 算法的基础实现（逐位计算）
        """
        crc = 0x00  # 初始值
        polynomial = 0xD5  # 多项式

        for byte in data:
            if isinstance(byte, str):
                byte = ord(byte)  # 如果是字符串，转换为整数
            crc ^= byte
            for _ in range(8):
                if crc & 0x80:  # 检查最高位是否为1
                    crc = (crc << 1) ^ polynomial
                else:
                    crc = (crc << 1)
                crc &= 0xFF  # 确保保持在8位范围内

        return crc

    def buildOneFrame(self,cmd_code, data):
        frame = bytearray()
        frame.append(0x24)  # $
        frame.append(0x58)  # X
        frame.append(0x3C)  # < (传统方式) 或 0x90 (现代方式)
        frame .append(0) #flag
        # 命令代码 (16位，小端)
        low = cmd_code & 0xFF
        frame.append(low)  # 低字节
        frame.append((cmd_code >> 8) & 0xFF)  # 高字节

        LEN = len(data)
        # 数据长度 (0，16位，小端)
        frame.append(LEN & 0xFF)  # 低字节
        frame.append((LEN >> 8) & 0xFF)  # 高字节

        for i in range(LEN):
            frame.append(data[i])
        # 计算 CRC8/D5 校验和 (从标志位开始)
        # self.crc_calculator.reset()
        check = self.crc8_dvb_s2(frame[3:])
        frame.append(check)

        return frame